import {
  CallHandler,
  ExecutionContext,
  Injectable,
  NestInterceptor,
} from '@nestjs/common';
import { Response } from 'express';
import { map, Observable } from 'rxjs';

@Injectable()
export class FormatResponseInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const response = context.switchToHttp().getResponse<Response>();

    /**
     * 对返回数据进行格式化
     * next.handle() 是 CallHandler 对象的方法，表示将请求传递给下一个处理程序，它返回一个 Observable 对象，表示响应数据
     * pipe() 是 RxJS 库的一个函数，用于对 Observable数据流进行操作转换，它接收若干个操作符，比如： map filter tap 并逐步处理这个数据流中的每个值
     */
    return next.handle().pipe(
      // 这里的 data 为响应数据
      map((data) => {
        return {
          code: response.statusCode,
          message: 'success',
          data,
        };
      }),
    );
  }
}
